package com.lsh.config;

import com.lsh.respsitory.SpringScheduledCronRepository;
import com.lsh.task.DynamicPrintTask3;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
 * @author ：LiuShihao
 * @date ：Created in 2020/8/24 4:36 下午
 * @desc ：查询数据库cron表达式  动态切换cron表达式
 *
 */
@Slf4j
//@Configuration
public class ScheduledConfig2 implements SchedulingConfigurer {
    public ScheduledConfig2(){
        System.out.println("-----ScheduledConfig2加载-----");
    }

    @Autowired
    private SpringScheduledCronRepository cronRepository;

    @Autowired
    DynamicPrintTask3 task3;
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            //可以通过改变数据库数据进而实现动态改变执行周期
            /**
             *
             * public void addTriggerTask(Runnable task, Trigger trigger) {
             *      this.addTriggerTask(new TriggerTask(task, trigger));
             *     }
             * 使用这个方法会增加一个触发任务 ：即  ！这个定时任务的下一次执行时间！
             * 参数：Runnable    一个事件
             * 参数：Trigger     一个触发器
             * public interface Trigger {
             *     @Nullable
             *     Date nextExecutionTime(TriggerContext var1);   下一次执行时间
             * }
             */
            taskRegistrar.addTriggerTask(((Runnable) task3),
                    triggerContext -> {
                        //获得该类的cron表达式
                        String cronExpression = cronRepository.findSpringScheduledCronByCronKey(task3.getClass().getName()).getCronExpression();
                        log.info("cronRepository.findByCronExpression():"+cronExpression);
                        // CronTrigger实现了Trigger
                        return new CronTrigger(cronExpression).nextExecutionTime(triggerContext);
                    }
            );
        }
    @Bean
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(10);
    }
}